package 程序员面试金典;

/**
 * 面试题 05.02. 二进制数转字符串
 * 二进制数转字符串。给定一个介于0和1之间的实数（如0.72），类型为double，打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示，则打印“ERROR”。
 *
 * 示例1:
 *
 *  输入：0.625
 *  输出："0.101"
 * 示例2:
 *
 *  输入：0.1
 *  输出："ERROR"
 *  提示：0.1无法被二进制准确表示
 *
 *
 * 提示：
 *
 * 32位包括输出中的 "0." 这两位。
 * 题目保证输入用例的小数位数最多只有 6 位
 */
public class T05_02 {
    /**
     * 十进制小数转换成二进制小数采用"乘2取整，顺序排列"法。
     * 具体做法是：用2乘十进制小数，可以得到积，将积的整数部分取出，再用2乘余下的小数 部分，又得到一个积，再将积的整数部分取出，如此进行，直到积中的小数部分为零，或者达到所要求的精度为止。
     * 然后把取出的整数部分按顺序排列起来，先取的整数作为二进制小数的高位有效位，后取的整数作为低位有效位。
     */
    public String printBin(double num) {

        StringBuilder builder = new StringBuilder();
        builder.append("0.");
        while (num != 0 && builder.length() <= 34) {
            num = num * 2;
            builder.append((int) num);
            if (num >= 1) {
                num = num - 1;
            }
        }
        return num == 0 ? builder.toString() : "ERROR";


    }

    public static void main(String[] args) {
        T05_02 t05_02 = new T05_02();
        t05_02.printBin(0.625);
    }
}
